package com.sap.sap_mangers.mapper;

import com.sap.sap_mangers.Vo.ShareVo.SapShareVo;
import com.sap.sap_mangers.dto.share.ModifyFile;
import com.sap.sap_mangers.dto.share.UploadFile;
import com.sap.sap_mangers.pojo.SapShare;
import com.sap.sap_mangers.pojo.SapShareType;
import com.sap.sap_mangers.pojo.SapShareVersion;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.sql.Timestamp;
import java.util.List;

/**
 * @author 阿东
 * @date 2022/9/12 [0:19]
 */
@Mapper
public interface ShareMapper {
    /**
     * 上传文件，写入信息到数据库
     *
     * @param uploadFile 上传文件相关信息
     */
    void uploadFile(@Param("uploadFile") UploadFile uploadFile);

    /**
     * 获取资料类型
     *
     * @return 资料类型
     */
    List<SapShareType> getSapShareType();

    /**
     * 根据ID获取对应资料类型
     *
     * @param shareTypeId 资料类型ID
     * @return 资料类型
     */
    SapShareType getSapShareTypeById(@Param("shareTypeId") Integer shareTypeId);

    /**
     * 获取未审核的上传记录
     *
     * @return 未审核的资料上传记录
     */
    List<SapShareVo> getSapShareThatNotNotBeAudited();

    /**
     * 获取所有上传记录
     *
     * @return 所有上传记录
     */
    List<SapShareVo> getAllSapShare();

    /**
     * 更新共享状态
     *
     * @param id    表ID
     * @param value 更新的值(0:公开，1:私密)
     */
    void updateShared(@Param("id") Integer id, @Param("value") Integer value);

    /**
     * 根据学号获取资料表的信息
     *
     * @param username 学号
     * @param approval 资料状态(0：未审核，1：通过审核，2:未通过审核，3：删除，4:被修改)
     * @return 信息
     */
    List<SapShare> getSapShare(@Param("username") String username, @Param("approval") Integer approval);

    /**
     * 根据学号获取资料表的信息(用于用户端)
     *
     * @param username 学号
     * @return 信息
     */
    List<SapShareVo> getSapShareForUser(@Param("username") String username);

    /**
     * 删除文件
     *
     * @param id 文件的id
     */
    void deleteFile(@Param("id") Integer id);

    /**
     * 更新下载的次数，每访问一次+1
     *
     * @param id 资料id
     */
    void updateDownloadFile(@Param("id") Integer id);

    /**
     * 通过id获取资料信息
     *
     * @param id id
     * @return 资料信息
     */
    SapShare getShareMessageById(@Param("id") Integer id);

    /**
     * 获取 以纯网址形式分享的资料/笔记 (按资料类型id值从小到大排列)
     *
     * @return 以纯网址形式分享的资料/笔记
     */
    List<SapShareVo> getApprovedShareWhichHaveUrl();

    /**
     * 获取以对象存储文件(地址)形式分享的资料/笔记 (按资料类型id值从小到大排列)
     *
     * @return 以对象存储文件(地址)形式分享的资料/笔记
     */
    List<SapShareVo> getApprovedShareWhichHaveCos();

    /**
     * 更新提示
     *
     * @param id  id
     * @param tip 提示
     */
    void updateTip(@Param("id") Integer id, @Param("tip") String tip);

    /**
     * 修改资料，将新版本的信息写入数据库，如果审核通过旧版本将过期
     *
     * @param modifyFile 上传文件相关信息
     * @return 主键(资料分享ID)
     */
    Integer modifyFile(@Param("modifyFile") ModifyFile modifyFile);

    /**
     * 添加版本更新记录 (修改资料时添加，审核如果通过旧版本将过期)
     *
     * @param newShareId 新版本的资料分享编号
     * @param oldShareId 旧版本的资料分享编号
     */
    void addNewVersionRecord(@Param("newShareId") Integer newShareId, @Param("oldShareId") Integer oldShareId);

    /**
     * 在审核时修改资料上传记录的状态
     *
     * @param shareId         资料分享记录编号
     * @param approval        审核状态 (1.通过；2.拒绝)
     * @param approvalTime    审核时间 (当前时间)
     * @param managerUsername 审核人学号
     * @param managerName     审核人姓名
     */
    void updateShareWhenAudit(@Param("shareId") Integer shareId, @Param("approval") Integer approval, @Param("approvalTime") Timestamp approvalTime, @Param("managerUsername") String managerUsername, @Param("managerName") String managerName);

    /**
     * 查找是否有对应的旧版本数据 (在提交修改资料时会生成数据)
     *
     * @param newShareId 资料分享ID
     * @return 修改资料版本记录 (为null说明不是修改的资料)
     */
    SapShareVersion getSapShareVersionByNewId(@Param("newShareId") Integer newShareId);

    /**
     * (新版本审核通过时)使旧版本资料分享记录过期
     *
     * @param oldShareId (原资料的) 资料分享ID
     */
    void makeOldShareVersionOverdue(@Param("oldShareId") Integer oldShareId);

    /**
     * 根据新上传版本的分享ID修改资料分享版本表的替换标识
     * <p>
     * (如果新版本审核通过就改为1，被驳回就改为2)
     * (为1表示原版本被替换，同时要将原资料分享)
     *
     * @param newShareId (新版本资料的)资料分享ID
     * @param ifUpdate   替换标识 1:已被替换 2:没被替换
     */
    void updateSapShareVersionIfUpdateByNewVersion(@Param("newShareId") Integer newShareId, @Param("ifUpdate") Integer ifUpdate);

    /**
     * 通过旧ID获取版本记录信息
     *
     * @param id 旧id
     * @return ..
     */
    List<SapShareVersion> getSapShareVersionByOldId(@Param("id") Integer id);

    /**
     * 通过原版本ID和指定条件(版本替换状态)获取版本记录信息
     * <p>
     * 查看是否有未经审核的修改版本将ifUpdate参数设置为0  (1表示已被替换，2表示没被替换)
     *
     * @param oldShareId 原版本资料分享记录ID
     * @param ifUpdate   指定条件(版本替换状态)
     * @return 版本数据
     */
    List<SapShareVersion> getSapShareVersionByOldIdWithCondition(@Param("oldShareId") Integer oldShareId, @Param("ifUpdate") Integer ifUpdate);

    /**
     * 获取可共享的资料中下载/访问次数前十名的数据
     *
     * @return 可共享的下载量前十的资料
     */
    List<SapShareVo> getApprovalTopTen();

    /**
     * 继承旧版本的下载量 - 在修改版本审核通过时使用
     *
     * @param newShareId 新版本资料ID
     * @param oldShareId 旧ID
     */
    void inheritDownloadsFromOlderVersion(@Param("newShareId") Integer newShareId, @Param("oldShareId") Integer oldShareId);
}
